
package com.jf.cloud.product.service;

import com.jf.cloud.api.product.bo.PlatformCommissionOrderItemBO;
import com.jf.cloud.common.product.vo.CategoryVO;
import com.jf.cloud.common.product.vo.app.CategoryAppVO;
import com.jf.cloud.common.product.vo.app.CategorySearchAppVO;
import com.jf.cloud.product.bo.CategoryRateBO;
import com.jf.cloud.product.dto.CategoryDTO;
import com.jf.cloud.product.vo.CategoryExcelVO;
import com.jf.cloud.product.vo.CategoryPlatformExcelVO;

import java.util.List;
import java.util.Map;
import java.util.Set;

/**
 * 分类信息
 *
 * @author zz
 * @date 2020-10-28 15:27:24
 */
public interface CategoryService {

    /**
     * 根据分类信息(分类、上级分类名称列表)
     *
     * @param categoryId 分类信息id
     * @return 分类信息
     */
    CategoryVO getInfo(Long categoryId);

    /**
     * 根据分类信息（缓存）
     *
     * @param categoryId 分类信息id
     * @return 分类信息
     */
    CategoryVO getById(Long categoryId);


    /**
     * 根据分类信息（缓存）
     * 防止出现未登录情况下访问的商品分类被删除而出现找不到分类错误
     * @param categoryId 分类信息id
     * @return 分类信息
     */
    CategoryVO getByCategoryId(Long categoryId);

    /**
     * 保存分类信息
     * @param categoryDTO 分类信息
     */
    void save(CategoryDTO categoryDTO);

    /**
     * 更新分类信息
     * @param categoryDTO 分类信息
     */
    void update(CategoryDTO categoryDTO);

    /**
     * 根据分类信息id删除分类信息
     * @param categoryId 分类id
     * @param shopId 店铺id
     */
    void deleteById(Long categoryId, Long shopId);

    /**
     * 获取分类列表(未删除的分类--启用、未启用状态的分类)
     * @param shopId 店铺id 必填
     * @return
     */
    List<CategoryAppVO> list(Long shopId);

    /**
     * 获取分类id列表
     * @param parentId
     * @return
     */
    List<Long> listCategoryId(Long parentId);

    /**
     * 根据shopId 和 categoruId 清除分类缓存
     * @param shopId
     * @param categoryId
     * @param getSysType
     */
    void removeCategoryCache(Long shopId, Long categoryId, Integer getSysType);

    /**
     * 分类的启用和禁用
     * @param categoryDTO
     * @param sysType
     * @return
     */
    List<Long> categoryEnableOrDisable(CategoryDTO categoryDTO, Integer sysType);

    /**
     *  获取分类的pathName集合
     * @param categories 分类集合
     */
    void getPathNames(List<CategoryVO> categories);

//    /**
//     * 获取分类列表 (仅返回启用状态的分类)
//     * @param parentId 上级分类id
//     * @param shopId 店铺id
//     * @return
//     */
//    List<CategoryVO> categoryList(Long shopId, Long parentId);

    /**
     * 根据店铺id和上级id，获取分类列表
     * @param shopId 店铺id
     * @param parentId 上级分类id
     * @param lang 语言
     * @return 分类列表
     */
    List<CategoryAppVO> listByShopIdAndParenId(Long shopId, Long parentId, Integer lang);

    /**
     * 获取可用的一级平台分类(即含有启用状态下三级分类的一级分类列表)
     * @param shopId 店铺id
     * @param parentId 上级分类id
     * @param lang 语言
     * @return 分类列表
     */
    List<CategoryAppVO> listPlatformCategoryByShopIdAndParenId(Long shopId, Long parentId, Integer lang);

    /**
     * 获取分类列表 (仅获取启用状态以及包含三级分类的分类信息)
     * @param shopId 店铺id
     * @param lang 语言
     * @return 分类列表
     */
    List<CategoryAppVO> shopCategoryList(Long shopId, Integer lang);

    /**
     * 获取整个平台的佣金比例
     * @return 整个平台的佣金比例
     */
    List<CategoryRateBO> listRate();


    /**
     * 根据店铺id获取店铺签约的分类列表
     * @param shopId
     * @param sysType
     * @param lang
     * @return
     */
    List<CategoryAppVO> listSigningCategory(Long shopId, Integer sysType,Integer lang);

    List<CategoryAppVO> listTopCategory(Long shopId, Integer sysType,Integer lang);
    /**
     * 根据分类id列表，获取分类列表
     * @param categoryIds 分类id列表
     * @return 分类列表
     */
    List<CategoryVO> listByCategoryIds(Set<Long> categoryIds);

    /**
     * 获取一级分类
     * @return
     */
    List<Map<String, Object>> listPrimaryCategoryId();

    /**
     * 一级分类下三级分类
     * @param cateId
     * @return
     */
    List<Long> listByPrimaryCategoryId(Long cateId);
    /**
     * 获取店铺二级分类
     * @param shopId
     * @return
     */
    List<CategoryVO> listAndLangInfoByShopId(Long shopId);

    /**
     * 获取店铺签约分类及国际化信息
     * @param shopId
     * @return
     */
    List<CategoryVO> getShopSigningCategoryAndLangInfo(Long shopId);

    /**
     * 平台分类
     * @return
     */
    List<CategoryAppVO> platformCategories();

    /**
     * 获取当前节点所有父节点的分类ids，以及当前分类节点的父级节点的父级几点的分类ids
     * @param categoryIds 当前分类节点ids
     * @return 所有父级节点ids
     */
    List<Long> getParentIdsByCategoryId(List<Long> categoryIds);

    /**
     * 根据skuId获取skuId分类列表
     * @param platformCommissionOrderItems skuId分类列表
     * @return skuId分类列表
     */
    List<PlatformCommissionOrderItemBO> listBySkuIds(List<PlatformCommissionOrderItemBO> platformCommissionOrderItems);

    /**
     * 获取店铺二级分类(已经启用的分类)
     * @param shopId
     * @return
     */
    List<CategoryVO> listEnable(Long shopId);

    /**
     * 分类-搜索参数
     * @param categoryId
     * @return
     */
    CategorySearchAppVO categorySearchItem(Long categoryId);

    /**
     * 获取可以签约的平台分类列表（已经签约平台分类不会返回）
     * @param shopId
     * @param sysType
     * @return
     */
    List<CategoryVO> listApplySigningCategory(Long shopId, Integer sysType);

    /**
     * 获取导出平台分类列表
     * @return
     */
    List<CategoryPlatformExcelVO> listExcelPlatform();

    /**
     * 获取导出商家/供应商分类列表
     * @param shopId
     * @return
     */
    List<CategoryExcelVO> listExcel(Long shopId);
}
